<?php

namespace app\common\model\Subject;

use think\Model; 
use think\Request;


class Subject extends Model
{

 

    // 指定模型可操作的表名。操作数据库的一张表，表名为subject。
    // 把变量名由name换成table,表名也要换：protected $name = "subject_teacher";
    protected $name = "subject";

    // 开启时间戳。指定自动插入时间戳。因为表那里有cteatime,创建时间
    protected $autoWriteTimesamp = true;

    // 插入时间自动写入的字段名。因为插入是调用save()方法，就会把时间戳自动写入"cteatetime"字段名里面，如果没有这个字段，写入时就会报错。
    protected $creatime = "cteatetime";

    // 更新时候写入字段名。
    // 另外，除了插入的时候会生成时间戳字段，更新的时候也会生成时间戳字段。但是因为列表没有更新时间，所以更新时不需要生成时间戳，所以这里设置为false
    protected $updateTime = false;
    
    // 忽略数据表不存在的字段
    protected $field = true;

    
    // 追加属性(虚拟字段),追加一个点赞人数的字段给模型，这个模型不会给到后台数据库
    protected $append = [
        'thumbs_text',
        // 不能数据库的字段名的名字likes重复，否则会报错。逻辑是，下面方法getLikesTextAttr（）获得数值给到这里的字段likes_text，字段再传到index.html输出
        'likes_text',
        // 添加时间戳的虚拟字段。因为在fast/application/home/view/index/subject.html视图渲染那里，时间输出还是个时间戳的形式
        'createtime_text'
        
    ];

    // 获取器
    // getLikesTextAttr，两边的get和Attr是固定的，中间LikesText是追加属性的自己创建的名字,首字母大写，有下划线也首字母大写。
    // 两个回调参数，只需要$data，
     public function getLikesTextAttr($value, $data)
    {
        // 从$data里面取like字段名。有就取没有就给空
        // data 你当前要操作的一整条的数据
        $likes = isset($data['likes']) ? trim($data['likes']) : '';

        // 如果没有人点赞,返回0
        if(empty($likes))
        {
            return 0;
        }

        //如果有人点赞，字符串转换成数组
        $arr = explode(',', $likes);

        return count($arr);
    }

     public function getThumbsTextAttr($value, $data)
    {
        //获取域名部分
        $domain = Request::instance()->domain();
        // 您提到的trim($domain, '/')是一个PHP函数的调用，它的作用是去除字符串$domain两端的斜杠(/)。这个函数通常用于处理URL或者路径字符串。
        $domain = trim($domain, '/');

        $thumbs = isset($data['thumbs']) ? $data['thumbs'] : '';

        //如果为空就给一个默认图片地址
        if(empty($thumbs) || !is_file(".".$thumbs))
        {
            $thumbs = "/assets/home/images/video.jpg";
        }
        
        return $domain.$thumbs;
    }

    // 时间戳的方法
    public function getCreatetimeTextAttr($value, $data)
    {
        // 拿到createtime的字段。如有就拿，没有就给空，并且赋值给$createtime
        $createtime = isset($data['createtime']) ? trim($data['createtime']) : "";

        // 来个判断，
        // 如果为空就返回无时间
        if(empty($createtime))
        {
            return '暂无上架时间';
        }
        /* 如果有时间，就把时间戳转换为时分秒形式,并且赋值给$createtime，再传回去发送过来那里fast/application/home/view/index/subject.html视图渲染那里
        注意！date()是一个函数，与$data无关*/
        return date("Y-m-d",$createtime);
    } 

    // 调用分类查询category()和关联查询teacher()这两个方法的地方：控制器application/home/controller/index.php的课程搜索里面的方法subject()里面

    

    //关联查询
    public function teacher()
    {
        //课程：老师 1：1
        // 老师：课程 1：n
        // setEagerlyType(0); JOIN查询，也就是连表查询
        // setEagerlyType(1); IN查询，也就是；列表查询
         
        /* belongsTo（，，，，）里面的，
        第一个参数，'app\common\model\Teacher\Teacher'，就是当前模型（$this）关联的模型是老师的模型，
        第二个参数，'teacherid'，外键关系teacherid（也就是课程表中的外键teacherid是对应teacher表中的主键字段'id'），
        第三个参数，'id'，表示是teacher表的主键字段id ，
        第四个参数，[]，是废弃掉的，给个空数组就好
        第五个参数，'LEFT'，表示左连表查询，LEFT 表示关联的关系是左连接的，
        即即使当前学生没有所属的老师，也不会导致该学生记录被排除在外。*/
        /*
        belongsTo 是 Active Record 中定义关联关系的方法之一，用于表示一种一对一的关联关系。在这行代码中，它表示当前模型（假设为 
        Student 模型）属于 Teacher 模型，关联的字段分别是 teacherid 和 id。这里的关联关系是定义在 Student 模型中的，表示每个学生
        都有一个所属的老师，关联的字段是 teacherid，即学生表中的一列字段，用于记录该学生所属的老师的 ID。另一方面，id 是 Teacher 模型中的
        主键字段，用于唯一标识每个老师。LEFT 表示关联的关系是左连接的，即即使当前学生没有所属的老师，也不会导致该学生记录被排除在外。
        综上所述，这行代码表示的关系是：每个学生都有一个所属的老师，并且可能没有所属的老师。
        */
        return $this->belongsTo('app\common\model\Teacher\Teacher', 'teacherid', 'id', [], 'LEFT')->setEagerlyType(0);
    }




    // 连表查询。此连表查询的方法调用位置是，Subject.php控制器中的Info()方法，判断课程信息是否存在
    public function category()
    {
        return $this->belongsTo('app\common\model\Subject\Category', 
        'cateid', 'id', [], 'LEFT')->setEagerlyType(0);
    }
}
